package com.tc.socket.config;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.Session;

//ws://localhost:8001/websocket/A
@ServerEndpoint(value = "/websocket/{userId}")
@Component
@Slf4j
public class WebSocketEndpoint {


	/**
	 * 连接建立成功调用的方法
	 */
	@OnOpen
	public void onOpen(Session session, @PathParam("userId") String userId) {
		// 把会话存入到连接池中
		log.info("连接建立后 当前实例:{},session信息:{},userId: {}",this,session,userId);
		SessionPool.sessions.put(userId, session);
	}

	/**
	 * 关闭连接
	 */
	@OnClose
	public void onClose(Session session) throws IOException {
		log.info("连接关闭后  当前实例: {},session信息: {}",this,session);
		SessionPool.close(session.getId());
		session.close();
	}

	/**
	 * 收到客户端消息后调用的方法
	 *
	 * @param message
	 *            客户端发送过来的消息
	 */
	@OnMessage
	public void onMessage(String message, Session session) {

		/**
		 * 群发
		 */
		log.info("接收到客户端信息 当前实例: {},session信息:{}",this,session);

		// 如果是心跳检测的消息，则返回pong作为心跳回应
		if (message.equalsIgnoreCase("ping")) {
			try {
				Map<String, Object> params = new HashMap<String, Object>();
				params.put("type", "pong");
				session.getBasicRemote().sendText(JSON.toJSONString(params));
				System.out.println("应答客户端的消息:" + JSON.toJSONString(params));
			} catch (Exception e1) {
				e1.printStackTrace();
			}
			return;
		}
		if (message.indexOf("{")==-1){
			SessionPool.sendMessage(message);
		}else{
			/**
			 * 单发
			 */
			Map<String, Object> params = JSON.parseObject(message, new HashMap<String, Object>().getClass());
			SessionPool.sendMessage(params);
		}

	}

}
